#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sys/stat.h>
//#include "../source/server.hpp"

size_t Split(const std::string &src, const std::string &sep, std::vector<std::string> *arry) {
    size_t offset = 0;
    // abc,bcd,def,
    // 有10个字符，offset是查找的起始位置，范围应该是0~9，offset==10就代表已经越界了
    while(offset < src.size()) {
        size_t pos = src.find(sep, offset);//在src字符串偏移量offset处，开始向后查找sep字符/字串，返回查找到的位置
        if (pos == std::string::npos) {//没有找到特定的字符
            //将剩余的部分当作一个字串，放入arry中
            if(pos == src.size()) break; 
            arry->push_back(src.substr(offset));
            return arry->size();
        }
        if (pos == offset) {
            offset = pos + sep.size();
            continue;//当前字串是一个空的，没有内容
        }
        arry->push_back(src.substr(offset, pos - offset));
        offset = pos + sep.size();
    }
    return arry->size();
}
//读取文件内容，将读取到的内容放到Buffer中
static bool ReadFile(const std::string& filename,std::string& buf)
{
    std::ifstream ifs(filename,std::ios::binary);
    if(ifs.is_open()==false)
    {
        printf("OPEN %s FILE FAILED !",filename.c_str());
        return false;
    }
    ifs.seekg(0,ifs.end);
    size_t fsize=ifs.tellg();
    ifs.seekg(0,ifs.beg);

    buf.resize(fsize);
    ifs.read(&buf[0],fsize);
    if(ifs.good()==false)
    {
        printf("READ %s FILE FAILED !",filename.c_str());
        ifs.close();
        return false;
    }
    ifs.close();
    return true;
}
static bool WriteFile(const std::string &filename, const std::string &buf) {
    //以二进制和截断模式打开文件，截断模式就是如果文件存在，文件内容会被清空，如果不存在，会创建一个新文件
    std::ofstream ofs(filename, std::ios::binary | std::ios::trunc);
    if (ofs.is_open() == false) {
        printf("OPEN %s FILE FAILED!!", filename.c_str());
        return false;
    }
    ofs.write(buf.c_str(), buf.size());
    if (ofs.good() == false) {
        printf("WRITE %s FILE FAILED!", filename.c_str());
        ofs.close();    
        return false;
    }
    ofs.close();
    return true;
}
static std::string UrlEncode(const std::string& url, bool convert_space_to_plus) {
    std::string res;
    for (auto &c : url) {
        if (c == '.' || c == '-' || c == '_' || c == '~' || isalnum(c)) {
            res += c;
            continue;
        }
        if (c == ' ' && convert_space_to_plus == true) {
            res += '+';
            continue;
        }
        //剩下的字符都是需要编码成为 %HH 格式
        char tmp[4] = {0};
        snprintf(tmp, 4, "%%%02X", c);
        res += tmp;
    }
    return res;
}
int main()
{
    // std::string str = "ab,,,,,,c,bcd,def,";
    // std::vector<std::string> arry;
    // Split(str, ",", &arry);
    // for (auto &s : arry) {
    //     std::cout << "[" << s << "]\n";
    // }
    // std::string buf;
    // bool ret=ReadFile("./any.cpp",buf);
    // if(ret==false) return false;
    // //std::cout<<buf<<std::endl;
    // ret=WriteFile("./lijinpeng.cpp",buf);
    // if(ret==false) return false;

    std::string str="https://kimi.moonshot.cn/chat/cvu962mn3mke7uri8bc0";
    std::string res=UrlEncode(str,true);
    std::cout<< res <<std::endl;
    return 0;
}